package com.train.mgr.modules.system.controller;

import com.train.common.model.PageResult;
import com.train.common.model.R;
import com.train.mgr.config.poi.ExcelUtil;
import com.train.mgr.modules.system.dto.request.DeptImportDTO;
import com.train.mgr.modules.system.dto.request.DeptPageReqDto;
import com.train.mgr.modules.system.dto.request.DeptReqDTO;
import com.train.mgr.modules.system.dto.response.DeptListRespDTO;
import com.train.mgr.modules.system.service.DeptService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.annotations.ApiIgnore;

import java.util.List;

/**
 * 组织部门信息
 *
 * @author cxg
 */
@RestController
@RequestMapping("/system/dept")
@Api(tags = "组织模块")
@ApiIgnore
public class DeptController
{
    @Autowired
    private DeptService deptService;

    /**
     * 获取组织列表
     */
    @GetMapping("/list")
    @ApiOperation("获取组织列表")
    public R<PageResult<DeptListRespDTO>> list(DeptPageReqDto param) {
        return R.succeed(deptService.selectDeptList(param));
    }

    /**
     * 查询组织部门列表（排除节点）

    @ApiOperation("查询组织列表（排除节点）")
    @GetMapping("/list/exclude/{deptId}")
    public R excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) {
        DeptPageReqDto dto = new DeptPageReqDto();
        dto.setDeptId(deptId);
        List<Dept> depts = deptService.selectDeptList(dto);
        depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
        return R.succeed(depts);
    }*/

    /**
     * 根据部门编号获取详细信息
     */
    @ApiOperation("组织详情")
    @GetMapping(value = "/{deptId}")
    public R getInfo(@PathVariable Long deptId) {
        return R.succeed(deptService.selectDeptById(deptId));
    }

    /**
     * 新增组织部门
     */
    @ApiOperation("新增组织")
    @PostMapping("/add")
    public R add(@Validated @RequestBody DeptReqDTO dept) {
        if (!deptService.checkDeptNameUnique(dept)) {
            return R.failed("新增组织'" + dept.getDeptName() + "'失败，组织名称已存在");
        }
        return R.succeed(deptService.insertDept(dept));
    }

    /**
     * 修改组织部门
     */
    @ApiOperation("修改组织")
    @PostMapping("/edit")
    public R edit(@Validated @RequestBody DeptReqDTO dto) {
        Long deptId = dto.getDeptId();
        if (!deptService.checkDeptNameUnique(dto)) {
            return R.failed("修改组织'" + dto.getDeptName() + "'失败，组织名称已存在");
        }
        else if (dto.getParentId().equals(deptId)) {
            return R.failed("修改组织'" + dto.getDeptName() + "'失败，上级组织不能是自己");
        }
        else if (deptService.selectNormalChildrenDeptById(deptId) > 0) {
            return R.failed("该组织包含未停用的子组织！");
        }

        return R.succeed(deptService.updateDept(dto));
    }

    /**
     * 删除组织部门
     */
    @ApiOperation("删除组织")
    @DeleteMapping("/del/{deptId}")
    public R remove(@PathVariable Long deptId) {
        if (deptService.hasChildByDeptId(deptId)) {
            return R.failed("存在下级组织,不允许删除");
        }
        if (deptService.checkDeptExistUser(deptId)) {
            return R.failed("组织存在用户,不允许删除");
        }
        return R.succeed(deptService.deleteDeptById(deptId));
    }

    /**
     * 获取组织部门树列表
     */
    @ApiOperation("获取组织树列表")
    @GetMapping("/deptTree")
    public R deptTree() {
        return R.succeed(deptService.selectDeptTreeList());
    }

    @ApiOperation("导入下属单位")
    @PostMapping("/import")
    public R<Boolean> importExcel(@RequestParam("file") MultipartFile file,
                                  @RequestParam(name = "deptId", required = true) Long deptId) {
        ExcelUtil<DeptImportDTO> util = new ExcelUtil<>(DeptImportDTO.class);
        List<DeptImportDTO> importList=null;
        try {
            importList = util.importExcel(file.getInputStream());
        } catch (Exception e) {
            throw new RuntimeException("excel导入客户数据解析异常，请联系管理员");
        }
        boolean result = deptService.saveExcelData(deptId,importList);
        return R.succeed("导入数据成功~");
    }
}
